Skip to content

docs(pm-skill): land the intake family's eight platform readings under the +34 ceiling ruling - #15190

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-14133-platform-readings-intake-2
Sep 4, 2026
Merged

docs(pm-skill): land the intake family's eight platform readings under the +34 ceiling ruling#15190
os-zhuang merged 2 commits into
mainfrom
claude/issue-14133-platform-readings-intake-2

Conversation

@claude

@claude claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Fixes #14133
Fixes #14694
Fixes #14743
Fixes #14778
Fixes #14798
Fixes #14605
Fixes #14898
Fixes #14445
Part of #15013

The second increment of the platform-readings.md intake. The first one landed
the corrections and reported that the family's additions did not fit the ratchet;
this one lands the eight readings under the ruling that sized them.

Attribution, as prose so it survives an edit: produced by Claude Code, session
https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox.

The ruling this executes

Maintainer, live PM chat, 2026-09-04, decision batch 27, on the recommendation
presented for #15013 — verbatim and untranslated, adopting option A:

「同意」

The director record (comment 5535777772) states what that adopts, in its own
words:

The ceiling for .claude/skills/pm-dispatch/references/platform-readings.md is
raised by the measured need, +34, to 358 — a named, sized raise under the
ratchet's own maintainer exit. The ratchet script's raise cites this ruling
verbatim in its comment, per the ratchet header's rule (a raised ceiling
carries the maintainer decision that authorised it).

The eight readings land as the intake flight wrote them (chain head +5 ·
payload channel +5 · search query shape +3 · channel envelope +6 · queue
instrument +8 · queue progress +2 · end-of-shift report +3 · body repair +2).
The three retracted statements stay deleted.

The +34 is a ceiling of the raise, not a target: if the eight readings land
in fewer lines, the raise is the smaller number.

It is an ORDINARY raise: not a CROSS_FILE_MOVES entry, no other ceiling moves,
and no re-wrap of untouched paragraphs used as line funding (2026-08-17 rule).

Per member, measured rather than estimated

Every reading was written in the file's own voice and wrapped by the gate's own
wrapLine — the canonical form, so no line can be over budget and no break can
land on one of the junctions that render as a space. 120 bytes per line, not
columns.

member reading lines
chain head #14133 the page-number walk's hard 422 at offset ~9,900, and the sort=created asc + desc partition with its overlap proof +5
payload channel #14694 the claim-bearing-field rule, and the absence rule for this channel +5
search query shape #14743 no GitHub qualifiers in the query, scope by parameter, the query written as a sentence +3
channel envelope #14778 try-the-other-channel on any refusal (+5); the label-removal carve-out (+1) +6
merge-queue instrument #14798 queue-ref parent-tip position chain (+3); merge-driver caveat (+3); full-page zero (+2) +8
queue progress #14605 the event=merge_group progress instrument and the batch-naming trap +2
end-of-shift report #14445 item 3 check_suite.completed is a wake (+1); the tier script answers only its own tree (+2) +3
body repair #14898 the raw-body source to repair from when the read itself is lossy +2
total +34

+34 is the ruling's ceiling and this landed exactly at it, so the raise is +34 and
not less. Nothing was shortened to fit, and nothing was padded to reach it.

⚠️ A note on the #14445 row, raised by this flight and since answered by the
seat.
The ruling and the dispatch both spell it Fixes, and this body follows
them. The flight flagged that the card is a shift-end report while only its item
③ is in this family, and asked whether the Part of spelling for that card
should be used instead, so that any unaddressed half would survive the merge. The
seat answered on the chain head: item ①1 was dispositioned on 2026-09-03, item ①2
was ruled KEPT on its own card, and item ② was routed — ③ was the only part still
outstanding, and it lands here. Fixes is correct and stays. Every other member
is single-fact and fully landed.

Two of the twelve edits land without their emphasis markers. Ten carry the
file's own bold convention; the label-removal carve-out and the merge-driver
caveat each cost one line MORE with theirs, which would have put the file at 360
— past the ruled ceiling. They land in the exact un-emphasised text the +34 was
measured on. Measured both ways: all-emphasis is +36, the landed mix is +34.

Deduped against origin/main before anything was written, exactly as the first
increment did: a fact the file already carries is cited, not re-spelled. The
three statements the first increment retracted stay deleted — reverse-checked by
grep on the landed tree.

Ratchet verdict, before and after

Before, on origin/main:

✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 324 lines (ceiling 324; headroom 0).

After, at 581bc995:

✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 358 lines (ceiling 358; headroom 0).
✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md: widest table row is 0 bytes (pin 0; headroom 0).

Headroom is 0, the same convention every other entry in the map keeps.

⚠️ One thing the ruling could not have sized: the standing cross-file move

This is the reviewer's decision point in this PR. Raising the ceiling row
alone leaves the gate RED, and the reason is a mechanism the ruling did not reach.

The same entry carries a live CROSS_FILE_MOVES declaration — the readings
consolidation that set the 324 ceiling about a day earlier. Its was: 314 is what
makes THAT move's raise computable from the tree. With the ceiling at 358 and
was left at 314, the gate reads the maintainer's independent +34 as though the
move had claimed it, and says so:

✗ check-skill-line-ratchet: cross-file move into .claude/skills/pm-dispatch/references/platform-readings.md raises its ceiling 314→358 (+44) against a net source decrease of 11 (… cli.md 35→31, … services.md 30→28, … rest-channel.md 93→88). A move pays for itself by DELETION at the source; …
✗ check-skill-line-ratchet: the declared cross-file moves raise the map's total by 33 lines.

That verdict is not wrong about its own arithmetic — it is measuring a raise the
sources were never asked to pay for. The declaration's docblock anticipates a
later raise colliding with it and says the accounting belongs to the later raise's
author, holding the ruling; that is this PR. It writes the case for a later raise
at a SOURCE, so a raise at the DESTINATION is the shape it does not have words for.

What this PR does: carries the destination's baseline forward with the raise,
was: 314348 (= 314 + the ruled 34), with the reasoning written beside it.
Everything the declaration exists to guard is preserved, and the numbers are the
ones it landed with:

✓ check-skill-line-ratchet: cross-file move into …/platform-readings.md: +10 (348→358) against a net source decrease of 11 (…); authorised by #14685 item 5 (comment 5520452691).
✓ check-skill-line-ratchet: declared cross-file moves: 1, total ceilings down 1 line.

+10 against −11, map total down one line — byte-for-byte the reading the move
landed with when the destination was at 324. A source that grows back still drives
the decrease under 10 and reds; the destination still reads PAID DOWN at or below
was. The reviewer's completeness check changes shape and the comment says so:
the SOURCES' was are still their origin/main values at f3ae441fa2, held
against that diff, while the DESTINATION's is that value plus every ordinary ruled
raise since — each carrying its own quoted ruling beside its ceiling.

Alternatives, if the seat prefers one — each is a one-line change: retire the
declaration (strictly weaker: it drops the source-regrowth guard the docblock was
written for), or teach the script to separate an ordinary raise from a move's
raise (a logic change to a governed script, which is a ruling, not an edit).
Nothing else in the map moved, and no new declaration was added.

Measured and NOT landed: the three post-ruling facts

The three facts recorded on the chain head AFTER the ruling — comments 5533510809,
5533845391 and 5534733764 — are outside the +34 the ruling sized, so they are
measured here and left for a later increment.

fact where it would go lines
the attribution footer mutates per CHANNEL — the MCP wrapper deletes the block, a raw REST PATCH appends a bare one and leaves a session-URL footer intact (+58 bytes, prefix byte-identical), and comment creation appends the same 58 on both channels, so a strict parse of an os-dev-report comment must stop at the last closing brace 读数陷阱, beside the existing PR-body footer bullet +5
the two write channels carry SEPARATE rate budgets and the MCP one is shared by identity, so an MCP refusal is a fact about that shared hourly window and not about this seat's; the two operations only MCP or GraphQL can do (draft flip, auto-merge) are unavailable for that window while everything else keeps flowing over REST API 配额, after the 红窗调度 row +6
total +11

Written in the file's voice and wrapped by the same wrapLine, so these are
landing costs, not estimates. The 5533845391 rows supersede 5533510809, which is
why they are one row here and not two. Landing them needs its own sizing decision;
this PR does not take it.

The four prior-regime holds, read line by line against the landed file

Reported so the seat can close them on evidence. ⛔ No hold's text was edited into
the file: only facts among the eight landed. All four remain open here.

#13373 remains open — the payload channel drops the NEWEST timeline items past
the SSR first window (3 of 5 comments; front 15 edges of totalCount 21, back 0 of
21); proposed remedy was to compare rendered edges against totalCount.

  • STATED at L149: the comment list is one of the two things the file now calls
    untrustworthy, with the same 15-item first window and a measured shape of the
    same kind (12 comments served as 3).
  • STATED at L152: the in-band detector, in the file's own spelling — absence
    on this channel is not a reading unless hasNextPage: false or a second channel
    says so. Same mechanical test the card asked for, written as the flag the
    payload itself carries.
  • NOT STATED: the card's per-half edge/totalCount arithmetic. The file states
    the rule, not that instance's numbers.
  • ⇒ Superseded in substance. Closable on L149 + L152.

#13385 remains open — only the first 15 timeline items render and the tail
comes back EMPTY, so a read-back of a just-posted comment is byte-identical to
sanitizer damage; asked for option B, a discriminator.

  • STATED at L149: the 15-item first window and hasNextPage: true, verbatim
    in the file's voice.
  • STATED at L152: read your own just-written content back over the channel you
    wrote it on — the card's rule, with a broader predicate than its get_comments
    spelling.
  • STATED at L152, and this is option B: the discriminator is hasNextPage: false or a second channel. Cheaper than the card's proposal, which needed a
    known-present earlier comment as a positive control.
  • NOT STATED: the explicit page parameter spelling, and the anecdote that the
    reading looks exactly like sanitizer damage — carried in substance by 「本档的
    缺席不是读数」 plus the separate truncation-diagnosis bullet.
  • ⇒ Superseded. Closable.

#13387 remains open — the payload is CDN-CACHED and can be minutes-to-hours
stale; a cache-buster query string and a no-cache header did NOT defeat it across
three fetches over 75 minutes. One seat asserted a half-state about another seat's
work on that read.

  • STATED at L152: 「本档的缺席不是读数」 is the general form of the card's
    rule, and it covers the half-state and race-recheck instances by construction.
  • STATED at L151: claim-bearing fields — assignees, pm:* labels, state
    are never read from this channel, which is exactly the half-state case behind
    the card's damage report.
  • PARTLY STATED at L150: "4–12 重取仍缺" records that a refetch does not
    repair the gap, but attributes it to the first-window truncation.
  • NOT STATED — a genuine residue: the CAUSE. Nothing in the file says the
    channel is CDN-cached, or that a cache-buster plus a no-cache header was
    measured and did not defeat it. A reader gets the rule but cannot tell why
    re-fetching will not help, which is the one thing this card measured that the
    other two did not.
  • ⇒ NOT fully superseded. One candidate line for a later increment; closable only
    if the seat judges the rule sufficient without the mechanism.

#13257 remains open — agent-created Routine transport: sessions fired by
create_trigger get no mcp__github__* tools (two probes, the second excluding
the competing explanation); self-binding wakes an existing session with its tools
loaded; create_trigger takes neither sources nor model and falls to the
default tier; agents cannot edit a UI-created Routine; and the orphan-timer
recovery path.

  • NOT STATED, none of it. The only adjacent text is L356, the 断粮 section,
    which points at the main file for 定时器选型 and carries only ccusage blocks.
  • ⇒ Entirely unaddressed. It is a different fact family from the eight, was never
    inside the ruling's sizing, and needs its own increment sized on its own.

Scope held

  • File surface: platform-readings.md, plus the one ceiling row with its quoted
    ruling and — declared above — the standing move declaration's baseline, in
    scripts/pm/check-skill-line-ratchet.mjs. No other file.
  • Facts whose home is rest-channel.md or lanes/** were not written anywhere.
  • No other ceiling moved; no CROSS_FILE_MOVES entry was added; no re-wrap was
    used as funding. The two bullets the previous increment reported as unspent
    payment candidates are still unspent.

Verification

node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands,
no paths, re-derived AFTER the final commit — it read the change set from git as
exactly the two paths above and named 27 runnable families. All 27 run green
at git rev-parse --short HEAD = 581bc99. Every exit code captured by
redirect before any pipe; each verdict below is the gate's own line.

check-ci-filter-parity: OK: all 143 declared cross-package glob(s) (99 unique) are covered.
check-closing-keyword-parity: OK (3 parsers agree on all 9 keywords and both measured separators; sweep found 5 file(s) across 8259 tracked, all registered).
check-closing-keyword-parity --self-test: 24 assertions, 5 mutations of the shipped parsers each driven to red.
comment-mask corpus sweep: 5864 files, 0 disagree, 0 unparseable, 52.0s.
check-self-test-wired: every one of the 167 script(s) CI runs that ship a --self-test has that self-test run by CI.
check-whole-set-label-write: 0 violations — 259 file(s) over 3 root(s).
bare-root-worklist --self-test: 54 live row(s), 46 recorded verdict(s) — none stale, none missing, none contradicted.
check-governed-queue-guard self-test: 129 cases pass.
check:doc-formula-expressions: 9 example(s) judged clean across 1145 packages/spec/src files.
check-agent-test-spelling: 0 violations — 439 file(s), 9 separator(s) JUDGED.
check-bash32-floor: 26 tracked shell file(s) name no bash 4+ construct.
check-cli-command-ids: 326 command-id literal(s) across 115 file(s) all resolve.
check-cross-package-test-inputs: OK: 26 package(s) read outside themselves, all declared.
doc authoring guard: 46 published skill files clean; 14737 customer-facing string(s) across 725 spec sources clean.
check:entry-guard: 208 scripts/ file(s) — every entry guard goes through invoked-as.mjs.
check-nul-bytes: OK (scanned 8252 text file(s); no raw ASCII control bytes).
check:parse-guard: 207 scripts/ file(s) — every TypeScript parse goes through ts-parse.mjs.
dispatch-gates self-test: 1343 cases pass.
check-governed-merges --self-test: 245 assertions.
check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).
check-skill-line-ratchet self-test: 136 cases pass.
check-skill-line-ratchet: platform-readings.md is 358 lines (ceiling 358; headroom 0).
check-skill-line-ratchet: cross-file move into …/platform-readings.md: +10 (348→358) against a net source decrease of 11; authorised by #14685 item 5 (comment 5520452691).
check-skill-line-ratchet: declared cross-file moves: 1, total ceilings down 1 line.
check:pnpm-filter-targets: 142/181 --filter occurrence(s) across 33 file(s) resolve.
check-refd-timer-probe: 5859 source file(s) swept.
check-skill-frame-sync: 2 copies of the decision frame are structurally isomorphic across 2 files.
check-watch-hint-literal: 48 declaration(s) across 4 rostered name(s).

check-governed-merges --test on this PR's two paths returns its GOVERNED verdict
(exit 3 = EXIT_TEST_GOVERNED), naming .claude/** as the hit:

⛔  GOVERNED — a human merge is the review record for this PR (#9495 regime).

NOT MEASURED, then repaired to a real verdict: check:doc-formula-expressions
first exited 3 with PREREQUISITE NOT MET — the workspace package @objectstack/formula is not built, then again with the same for
@objectstack/lint. Exit 3 is not a finding; both packages were built through the
shared verify lock and the gate re-ran to the green verdict quoted above. Heavy
runs went through bash scripts/pm/os-verify-lock.sh -c (VERDICT command-exit 0;
held 70s, 40s and 354s across three batches, waited 0s / 0s / 0s, and 70s waited on
one build — shared-box seconds, as the lock's own verdict line states).

pnpm lint — a proven narrowing, not a skip. Repo-wide eslint . --no-inline-config
is CI's run. Locally the two changed paths were linted directly, and the narrowing
is measured on all three legs the discipline asks for:

  1. The population comes from eslint's own config, not a guess. The markdown
    file comes back File ignored because no matching configuration was supplied
    eslint's config puts .md outside its population entirely, so the only path of
    this diff eslint judges at all is the .mjs.
  2. The count comes from --format json: 2 entries returned, 1 judged, 0
    errors, 0 warnings
    on scripts/pm/check-skill-line-ratchet.mjs, exit 0.
  3. Invariance over untouched files: this repo runs one eslint.config.mjs
    which, in its own words at line 327, "never enables type-aware linting (no
    parserOptions.project, no typed @typescript-eslint rules) for ANY file".
    With no cross-file type program, a two-file diff cannot move the verdict on a
    file it does not contain.

One name in the dispatch does not exist in this repo: pnpm check:control-bytes
has no such script. The control-byte gate is spelled check:nul-bytes, it is in
the derived family, and it ran green above. The two changed files were also swept
directly for raw control bytes outside the gate — no hits.

The ratchet script's own test suite is its --self-test (136 cases, green above);
a repo-wide grep over *.test.* / *.spec.* for skill-line-ratchet returns no
dedicated test file, so nothing else is owed on that leg.

Merge path

.claude/** is a governed surface. Draft, human merge. Not flipped ready, no
auto-merge, no reviewers requested — the ruling puts the review request for
os-zhuang and hotlong with the seat, not with this flight. skip-changeset
applies: nothing is published from any package.


Generated by Claude Code

…ake ruling

The maintainer's 2026-09-04 ruling (decision batch 27) sizes the intake family's
eight readings at +34 and raises this entry's ceiling by exactly that. It is an
ORDINARY raise under the ratchet's own maintainer exit, quoted verbatim beside
the row per the header's rule for a raised ceiling — not a cross-file move, and
no other ceiling moves.

The standing cross-file-move declaration on the same entry carries its pre-move
baseline forward with it. That `was` exists only to make the MOVE's raise
computable from the tree; left at 314 it would price the maintainer's
independent +34 as though this move had claimed it (+44 against a net source
decrease of 11) and go red for lines the sources were never asked to pay. At 348
the move's own arithmetic is exactly what it landed with — +10 against -11, map
total still down one line — and every guard the declaration exists for still
fires: a source that grows back drives the decrease under 10 and reds, and the
destination still reads PAID DOWN at or below `was`.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
The eight readings the intake flight measured, written in the file's own voice,
wrapped to the gate's real budget of 120 bytes per line, and each placed in the
section its fact belongs to:

- the page-number walk's hard 422 refusal at offset ~9,900, with the
  sort=created asc + desc partition recipe and the overlap that proves it;
- the payload channel's claim-bearing-field rule and its absence rule — an
  empty scalar there is not a reading;
- the search matcher's query contract: no GitHub qualifiers in the query, scope
  by parameter, the query written as a sentence;
- try-the-other-channel on any refusal, and the label-removal carve-out;
- the queue-ref parent-tip position chain, the merge-tree merge-driver caveat,
  and the full-page first-page zero;
- the merge_group progress instrument and its batch-naming trap;
- check_suite.completed is a wake, not a gate reading, and the tier script
  answers only its own tree;
- the raw-body source to repair from when the read itself is lossy.

+34 lines exactly, per member as the ruling sized them. Deduped against the file
first: what it already carries is cited rather than re-spelled, and the three
statements the first increment retracted stay deleted.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
@os-zhuang
os-zhuang marked this pull request as ready for review September 4, 2026 05:46
@os-zhuang
os-zhuang enabled auto-merge September 4, 2026 05:46
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 4, 2026
Merged via the queue into main with commit 96b4af8 Sep 4, 2026
39 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-14133-platform-readings-intake-2 branch September 4, 2026 06:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[finding] MCP search_issues free-text matching returns 0 for terms present in open issue TITLES, with incomplete_results: false — the mandatory pre-filing dedupe step is silently answering "no duplicates" [finding] platform-readings: the zero-quota page payload channel can be stale on an issue's own SCALAR fields (assignees), not only on its comment list — a card reads as unassigned and a dev acts on it [finding] Platform reading: once a PR is in the merge queue, REST pull.auto_merge reads null — it is not "auto-merge was disabled"; the dequeue signal is the timeline event removed_from_merge_queue finding(skills): spec@objectui shift-end report 2026-09-02 — two principle gaps (types-face routing vs. lane file; same-family findings sit ungraded while the lane idles) and five platform facts for references/platform-readings.md [finding] The &page=N completeness walk refuses with HTTP 422 past 9,900 items — the ceiling on the remedy #14068 just landed

2 participants